#define _CRT_SECURE_NO_WARNINGS 1

#include <vector>
using namespace std;
//class Solution
//{
//    long long prev = LONG_MIN;
//public:
//    bool isValidBST(TreeNode* root)
//    {
//        return inOrder(root);
//    }
//
//    bool inOrder(TreeNode* root)
//    {
//        if (root == nullptr)
//            return true;
//
//        bool left = inOrder(root->left);
//
//        if (root->val <= prev)
//            return false;
//        prev = root->val;
//
//        bool right = inOrder(root->right);
//        return left && right;
//
//    }
//};

//#include <vector>
//#include <string>
#include <iostream>
using namespace std;
//
//string getSubStr(string s1, string s2)
//{
//	int n1 = s1.size(), n2 = s2.size();
//	vector<vector<int>> dp(n1 + 1, vector<int>(n2 + 1));
//	int length = 0;
//	int index = 0;
//	for (int i = 1; i <= n1; ++i)
//	{
//		for (int j = 1; j <= n2; ++j)
//		{
//			if (s1[i - 1] == s2[j - 1])
//			{
//				dp[i][j] = dp[i - 1][j - 1] + 1;
//				if (dp[i][j] > length)
//				{
//					length = dp[i][j];
//					index = i - 1;
//				}
//			}
//		}
//	}
//	return s1.substr(index - length + 1, length);
//}
//
//int main()
//{
//	string s1 = "adbccdefa2133ds";
//	string s2 = "fgceaada2133b2w";
//	cout << getSubStr(s1, s2) << endl;
//	return 0;
//}

class Base
{
public:
	virtual void func1()
	{
		cout << "hello base func1" << endl;
	}

	virtual void func2()
	{
		cout << "hello base func2" << endl;
	}
};

class Derive : public Base
{
public:
	virtual void func1()
	{
		cout << "hello Derive func1" << endl;
		func2();
	}

	virtual void func2()
	{
		cout << "hello Derive func2" << endl;
	}
};

int main()
{
	Derive* d = new Derive();
	Base* b = (Base*)d;
	d->func1();
}